﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.XPath;

namespace TwinHead.Frameworks.Xml
{
    /// <summary>
    /// XML의 각 엘리먼트(태그)정보를 표현하는 인터페이스 입니다.
    /// </summary>
    public interface IXmlTag : IDisposable
    {
        /// <summary>
        /// 현재 태그에 대응하는 XML 네비게이터를 설정하거나 가져옵니다.
        /// </summary>
        XPathNavigator Navigator { get; set; }

        /// <summary>
        /// 화면 표시명을 설정하거나 가져옵니다.
        /// </summary>
        string DisplayTagName { get; set; }

        /// <summary>
        /// 현재 태그의 정규화된 이름을 설정하거나 가져옵니다.
        /// <para>LocalName이 아님에 주의하세요.</para>
        /// </summary>
        string TagName { get; set; }

        /// <summary>
        /// 원본 XML문자열에서 현재 태그에 설정되어 있는 어트리뷰트 문자열을 설정하거나 가져옵니다.
        /// </summary>
        string TagAttribute { get; set; }

        /// <summary>
        /// 현재 태그의 값을 설정하거나 반환합니다.
        /// </summary>
        string TagValue { get; set; }

        /// <summary>
        /// 현재 태그가 참조 엘리먼트인지 여부를 설정하거나 가져옵니다.
        /// </summary>
        bool IsRef { get; set; }

        /// <summary>
        /// XSD를 변환한 경우 원본 문서에서 기술되어 해석된, 닷넷 프레임워크상의 타입을 설정하거나 반환합니다.
        /// </summary>
        object TagType { get; set; }

        /// <summary>
        /// 현재 태그의 부모태그를 설정하거나 가져옵니다.
        /// </summary>
        IXmlTag ParentNode { get; set; }

        /// <summary>
        /// 현재 태그의 XPATH를 반환합니다.
        /// </summary>
        /// <returns></returns>
        string GetXPath();


        /// <summary>
        /// 현재 태그의 하위 태그요소들의 목록을 가져옵니다.
        /// </summary>
        IList<IXmlTag> ChildNodeCollection { get; }

        /// <summary>
        /// 현재 태그의 하위 목록에서 지정한 자식 태그의 인덱스를 반환합니다.
        /// </summary>
        /// <param name="child"></param>
        /// <returns></returns>
        int IndexOfChildNode( IXmlTag child );

        /// <summary>
        /// 현재 태그의 하위 목록의 크기를 가져옵니다.
        /// </summary>
        int ChildNodesCount { get; }

        /// <summary>
        /// 지정한 태그명을 가진 태그를 하위 컬렉션에서 찾아 반환합니다.
        /// </summary>
        /// <param name="tagName"></param>
        /// <returns></returns>
        IList<IXmlTag> FindXmlTag( string tagName );

        /// <summary>
        /// 현재 태그 및 하위 태그들의 구조화된 XML문자열을 반환합니다.
        /// </summary>
        /// <returns></returns>
        string ToXmlString();

        /// <summary>
        /// XML네비게이터를 기반으로 구조화된 XSD문자열을 반환합니다. (XSD문서를 변환한 경우)
        /// </summary>
        /// <returns></returns>
        string ToXSDString();

        /// <summary>
        /// 현재 태그의 복사본을 반환합니다.
        /// </summary>
        /// <returns></returns>
        IXmlTag Clone( IXmlTag parent );

    }
}
